package com.zzl.myblog.View.Fragment;


import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.just.agentweb.AgentWeb;
import com.just.agentweb.AgentWebConfig;
import com.just.agentweb.DefaultWebClient;
import com.just.agentweb.WebChromeClient;
import com.zzl.myblog.Bean.ResponseBean.UserCollectArticleBean;
import com.zzl.myblog.Utils.HttpUtil;
import com.zzl.myblog.Utils.LogUtil;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

import com.zzl.myblog.R;
import com.zzl.myblog.Utils.responseUtility;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


/**
 * 基于 AgentWeb+Fragment
 * 依据username+webUrl ，创建fragment
 */
public class WebFragment extends Fragment {
    String username; // WebActivity传来的username
    
    View rootView;
    
    String TAG = "WebFragment";

    String strWebURL; // 文章url
    
    //碎片中使用butterknife略有不同
    private Unbinder unbinder;

    AgentWeb mAgentWeb;

    /**
     * fragment_web.xml
     */
    @BindView(R.id.ll_agent_web)
    LinearLayout linearLayout;

    /**
     * toolbar.main.xml
     */
    @BindView(R.id.iv_back)
    ImageView mBackImageView;

    @BindView(R.id.iv_finish)
    ImageView mFinishImageView;

    @BindView(R.id.toolbar_title)
    TextView mTitleTextView;

    @BindView(R.id.iv_more)
    ImageView mMoreImageView;

    // 弹出菜单
    private PopupMenu mPopupMenu;

    // 空构造器
    public WebFragment() {
        // Required empty public constructor
    }

    /*
     * 单例模式
     */
    public static Fragment newInstance(String webURL, String username) {
        WebFragment fragment = new WebFragment();

        // 封装bundle
        Bundle bundle = new Bundle();
        bundle.putString("webURL", webURL);
        bundle.putString("username", username);

        fragment.setArguments(bundle);
        // 返回fragment
        return fragment;
    }


    /*
     * onViewCreated 是在 onCreatedView后被触发
     */
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        LogUtil.d(TAG, strWebURL);

        //初始化mAgentWeb
        mAgentWeb = AgentWeb.with(this)//
                .setAgentWebParent((LinearLayout) linearLayout, -1, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))//传入AgentWeb的父控件。
                .useDefaultIndicator(-1, 3)//设置进度条颜色与高度，-1为默认值，高度为2，单位为dp。
                .setWebChromeClient(mWebChromeClient)
                .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) //严格模式 Android 4.2.2 以下会放弃注入对象 ，使用AgentWebView没影响。
                .setMainFrameErrorView(R.layout.agentweb_error_page, -1) //参数1是错误显示的布局，参数2点击刷新控件ID -1表示点击整个布局都刷新， AgentWeb 3.0.0 加入。
                .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)//打开其他页面时，弹窗质询用户前往其他应用 AgentWeb 3.0.0 加入。
                .interceptUnkownUrl() //拦截找不到相关页面的Url AgentWeb 3.0.0 加入。
                .createAgentWeb()//创建AgentWeb。
                .ready()//设置 WebSettings。
                .go(strWebURL); //WebView载入该url地址的页面并显示。

        AgentWebConfig.debug();

        // 初始化界面控件
        initView();

    }

    /*
     * 初始化界面控件
     * - 给Toolbar的各个ImagView绑定事件
     */
    private void initView() {
        mBackImageView.setOnClickListener(mOnClickListener);
        mFinishImageView.setOnClickListener(mOnClickListener);
        mMoreImageView.setOnClickListener(mOnClickListener);
    }

    /*
     * 生命周期：onCreatedView,之后触发onViewCreated
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_web, container, false);
        //返回一个Unbinder值（进行解绑），注意这里的this不能使用getActivity()
        unbinder = ButterKnife.bind(this, rootView);
        // 拿到传过来的 webURl, 展示网址用
        strWebURL = getArguments().getString("webURL");
        // 拿到传过来的 username , 收藏博文用
        username= getArguments().getString("username");
        Log.d(TAG, "onCreateView: username "+username);
        return rootView;
    }


    /**
     * 界面控件单击事件
     */
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                // 返回上一页
                case R.id.iv_back:
                    if (!mAgentWeb.back()) {
                        WebFragment.this.getActivity().finish();
                    }
                    break;
                // 关闭此网页
                case R.id.iv_finish:
                    WebFragment.this.getActivity().finish();
                    break;
                // 弹出菜单
                case R.id.iv_more:
                    // 调用自定义方法，初始化，显示菜单
                    showPoPup(v);
                    break;
                default:
                    break;

            }
        }

    };

    /*
     * 函数：菜单初始化、显示菜单
     */
    private void showPoPup(View view) {
        if (mPopupMenu == null) {
            // 创建 PopupMenu
            mPopupMenu = new PopupMenu(this.getActivity(), view);
            // 填充 菜单布局文件
            mPopupMenu.inflate(R.menu.toolbar_menu);
            // 自定义菜单项单击事件
            mPopupMenu.setOnMenuItemClickListener(mOnMenuItemClickListener);
        }
        // 显示PopMenu
        mPopupMenu.show();
    }

    /**
     * 菜单项单击事件
     */
    private PopupMenu.OnMenuItemClickListener mOnMenuItemClickListener = new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            WebView webView = null;
            if(mAgentWeb != null){
                webView = mAgentWeb.getWebCreator().getWebView();
            }
            switch (item.getItemId()) {
                // 分享
                case R.id.share:
                    if(webView != null){
                        LogUtil.i(TAG, "share");

                        Intent share_intent = new Intent();
                        share_intent.setAction(Intent.ACTION_SEND);//设置分享行为
                        share_intent.setType("text/plain");//设置分享内容的类型
                        share_intent.putExtra(Intent.EXTRA_SUBJECT, "标题"+ webView.getTitle());//添加分享内容标题
                        share_intent.putExtra(Intent.EXTRA_TEXT, "看看这个文章 :"+webView.getUrl());//添加分享内容
                        //创建分享的Dialog
                        share_intent = Intent.createChooser(share_intent, "share");
                        startActivity(share_intent);
                    }
                    return  true;
                // 收藏文章
                case R.id.collect_article:
                    LogUtil.i(TAG, "collect");
                    if (webView != null) {
                        String collectUrl = webView.getUrl();//网址
                        String collectTitles = webView.getTitle();//网页标题
                        // 插入服务器
                        Map<String,String> map = new HashMap<>();
                        map.put("collectUrl",collectUrl);
                        map.put("collectTitles",collectTitles);
                        map.put("nickname","defaultNickname");
                        map.put("username",username);
                        try{
                            HttpUtil.collect_POST("collect", map, new Callback() {
                                @Override
                                public void onResponse(Call call, Response response) throws IOException {
                                    String json = response.body().string();
                                    UserCollectArticleBean userCollectArticleBean = responseUtility.parse_UserCollectArticleBean(json);
                                    if(userCollectArticleBean.getStatus() .equals("400")){
                                        Looper.prepare();
                                        Toast.makeText(getContext(), "您已收藏过该博客", Toast.LENGTH_SHORT).show();
                                        Looper.loop();
                                    }
                                    Looper.prepare();
                                    Toast.makeText(getContext(), "收藏成功！", Toast.LENGTH_SHORT).show();
                                    Looper.loop();
                                }
                                @Override
                                public void onFailure(Call call, IOException e) {
                                    LogUtil.i(TAG,"保存收藏-访问服务器失败！");
                                }
                            });
                        }catch (Exception e){
                            LogUtil.i("err------",e.getMessage());
                        }
                    }
                    return true;

                // 复制文章链接
                case R.id.copy:
                    if (webView != null) {
                        // 自定义方法：toCopy
                        toCopy(WebFragment.this.getContext(), webView.getUrl());
                    }
                    return true;

                // 使用系统浏览器打开
                case R.id.default_browser:
                    if (webView != null) {
                        // 自定义方法：openBrowser
                        openBrowser(webView.getUrl());
                    }
                    return true;

                default:
                    LogUtil.i("cloys","xxx");
                    return false;
            }

        }
    };


    /*
     * 复制博文链接
     * - 参考：https://blog.csdn.net/xietansheng/article/details/70992032
     * - 使用：Android 系统剪贴板
     */
    private void toCopy(Context context, String text) {
        // 获取系统剪贴板
        ClipboardManager mClipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
        // 创建一个剪贴数据集，包含一个普通文本的数据条目
        ClipData clipData = ClipData.newPlainText(null, text);
        // 将数据集复制到剪贴板
        mClipboardManager.setPrimaryClip(clipData);
        Toast toast = Toast.makeText(getActivity(), "已成功复制！", Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.CENTER,0,0);
        toast.show();
    }

    /**
     * 自定义函数：打开浏览器
     * @param targetUrl
     */
    private void openBrowser(String targetUrl) {
        // 判断URL是否为空 或 为本地链接
        if (TextUtils.isEmpty(targetUrl) || targetUrl.startsWith("file://")) {
            Toast.makeText(this.getContext(), targetUrl + " 该链接无法使用浏览器打开。", Toast.LENGTH_SHORT).show();
            return;
        }
        // 启动android默认浏览器
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        Uri content_url = Uri.parse(targetUrl);
        intent.setData(content_url);
        startActivity(intent);
    }

    // AgentWeb 固定写法
    protected WebChromeClient mWebChromeClient = new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress); //这句解决了：进度条仅加载90%的问题
            Log.i(TAG, "onProgressChanged:" + newProgress + "  view:" + view);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            if (mTitleTextView != null && !TextUtils.isEmpty(title)) {
                //若网页标题大于10的字符长度，则截取前十字符，后面内容用...代替
                if (title.length() > 10) {
                    title = title.substring(0, 10).concat("...");
                }
            }
            assert mTitleTextView != null;
            mTitleTextView.setText(title);
        }
    };


    /**
     * AgentWebView 跟随 Fragment 生命周期，释放 CPU 更省电
     * https://github.com/Justson/AgentWeb
     */


    @Override
    public void onResume() {
        mAgentWeb.getWebLifeCycle().onResume();//恢复
        super.onResume();
    }

    @Override
    public void onPause() {
        mAgentWeb.getWebLifeCycle().onPause();
        super.onPause();
    }

    //onDestroyView中进行unbind 解绑操作
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mAgentWeb.getWebLifeCycle().onDestroy();
        unbinder.unbind();
    }

}